﻿#pragma once
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
#include <time.h>
#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'
//定义一下蛇默认的起始位置
#define POS_X 24
#define POS_Y 5
#define KEY_PRESS(VK)  ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
enum game_status//此枚举的所有成员变量类型都是enum game_status
{//运行,退出,撞墙,撞自己
	OK=1,
	ESC,
	KILL_BY_WALL,
	KILL_BY_SELF,
};

enum DIRECTION
{//up赋值为1,后面的几个变量的1值会自动依次递增
	UP=1,
	DOWN,
	LEFT,
	RIGHT,
};

//定一个蛇身结点
typedef struct snakenode
{
	int x;//x,y用于定位这个节点在游戏盘中的位置
	int y;
	struct snakenode* next;
}snakenode,*psnakenode;//snakenode是蛇身节点的类型,*psankenode是指向蛇身结点的指针类型


//定义一个贪吃蛇类型-指的是整个游戏的维护
//这个结构体是用来搭建整个游戏的框架的
//这个是整条贪吃蛇
typedef struct snake
{
	psnakenode psnake;//维护整条蛇的指针,这里的psnake指向头结点,可以代表这个贪吃蛇
	psnakenode pfood;//指向食物的指针
	int score;//当前累计的分数
	int foodweight;//吃掉一个食物所得的分数
	int sleeptime;//蛇休眠的时间,休眠时间和速度成反比
	enum game_status status;//表示游戏当前状态
	enum DIRECTION dir;//蛇当前走的方向
}Snake,*pSnake;//pSnake指的是指向整个贪吃蛇的指针

void GameStart(pSnake ps);
void welcometogame();
void CreatMap();

//初始化贪吃蛇
//参数传递贪吃蛇进行初始化,所以是pSnake, ps适用于进行操作的变量,ps可以代表这个结构体
void InitSnake(pSnake ps);//用pSnake类型的指针ps对蛇进行初始化

//创建食物
void CreateFood(pSnake ps);

//游戏运行的整个逻辑
void GameRun(pSnake ps);

void PrintHelpInfo();

//贪吃蛇移动
void SnakeMove(pSnake ps);

//判断下一个是不是食物
int NextisFood(pSnake ps,psnakenode  pNext);

void EatFood(pSnake ps, psnakenode  pNext);

//下一个位置不是食物
void NotEatFood(pSnake ps, psnakenode  pNext);


